home *** CD-ROM | disk | FTP | other *** search
/ Amiga Format CD 35 / Amiga Format AFCD35 (Issue 119, Jan 1999).iso / -in_the_mag- / reader_requests / fredobbutils / bbsrc / picrestore.s < prev    next >
Text File  |  1998-11-06  |  6KB  |  344 lines

  1. *** PicRestore V1.0    (CLI only!)
  2. * For use with the IFF-ILBM Ripper V1.0 bootblock!
  3. * The program will tell you what to do!
  4. *
  5. * Coded by Frédéric Bassaler (April 1996)
  6.  
  7. Start:
  8.     lea    cline(pc),a0
  9.     moveq    #clen,d0
  10.  
  11. ; parse command line args
  12.     clr.b    -1(a0,d0.w)
  13.     subq.l    #1,d0
  14.     move.l    d0,d5
  15. .spc    cmp.b    #$20,(a0)+
  16.     beq.s    .spc
  17.     subq.l    #1,a0
  18.     move.l    a0,args
  19.  
  20.     lea    dosname(pc),a1
  21.     moveq    #0,d0
  22.     move.l    4.w,a6
  23.     jsr    -552(a6)
  24.     move.l    d0,dosbase
  25.     beq.w    nodos
  26.     move.l    d0,a6
  27.  
  28.     move.l    #win,d1
  29.     move.l    #1005,d2
  30.     jsr    -30(a6)
  31.     move.l    d0,output
  32.     beq.w    nooutput
  33.  
  34.     tst.l    d5    ;no args?
  35.     beq.w    usage
  36.     move.l    args(pc),a0
  37.     cmp.b    #'?',(a0)
  38.     beq.w    usage
  39.  
  40.     lea    hello.txt(pc),a0
  41.     bsr.w    print
  42. .w
  43.     btst    #10,$dff016    ;test right mouse button
  44.     beq.w    nooutput
  45.     btst    #6,$bfe001    ;test left mouse button
  46.     bne.s    .w
  47.  
  48.     move.l    args(pc),d1    ;dest path
  49.     bsr.w    lock
  50.     move.l    d0,dirlock
  51.     beq.w    nooutdir
  52.     move.l    d0,d1
  53.     bsr.w    changedir
  54.     move.l    d0,olddir
  55. ;    beq.w    baddir
  56. * open trackdisk unit 0
  57.     lea    tdport(pc),a1
  58.     move.l    a1,-(sp)
  59.     move.l    4.w,a6
  60.     move.l    276(a6),$10(a1)        ;execbase->thistask
  61.     jsr    -354(a6)        ;AddPort()
  62.     lea    ioreq(pc),a1
  63.     move.l    (sp)+,14(a1)
  64.     lea    trackname(pc),a0
  65.     moveq    #0,d0        ;unit=0
  66.     moveq    #1,d1        ;flags
  67.     jsr    -444(a6)        ;OpenDevice
  68.     tst.l    d0
  69.     bne.w    remport
  70. * read 'hash' block (block number 2)
  71.     moveq    #1,d6        ;len: 1 block
  72.     moveq    #2,d7        ;offset: block 2
  73.     lea    hashbuf,a4
  74.     bsr.w    ReadBlk2
  75.     tst.l    d0
  76.     bne.s    readerr
  77.     bsr.w    MotOff
  78. ; test header
  79.     move.l    a4,a3
  80.     cmp.l    #'PICS',(a3)+
  81.     bne.s    baddisk
  82.     move    (a3)+,d5
  83.     subq    #1,d5    ;nbre d'images à sauver
  84.     clr    picnum
  85. * read disk blocks & save picture data into files
  86. .bcl
  87.     move.l    (a3)+,d7    ;offset
  88.     move.l    (a3)+,d0    ;len (en octets)
  89.     move.l    d0,readlen
  90.     move.l    d0,d6
  91.     lsr.l    #8,d6
  92.     lsr.l    #1,d6
  93.     addq.l    #1,d6        ;len en blocs
  94.     move.l    d6,nblocks
  95.  
  96.     bsr.w    SaveFile
  97.  
  98.     addq    #1,picnum
  99.     dbf    d5,.bcl
  100. .fini
  101.     lea    finished.txt(pc),a0
  102.     bsr.s    print
  103.     bra.s    CloseAll
  104. usage:
  105.     lea    usage.txt(pc),a0
  106.     bsr.s    print
  107.     bra.s    nooutput
  108. nooutdir:
  109.     lea    lockerr.txt(pc),a0
  110.     bsr.b    print
  111.     bra.s    nooutput
  112. baddir:
  113.     lea    baddir.txt(pc),a0
  114.     bsr.b    print
  115.     bra.s    nooutput
  116. readerr:
  117.     lea    readerr.txt(pc),a0
  118.     bsr.b    print
  119. cloff    bsr.w    MotOff
  120.     bra.s    closedev
  121. baddisk:
  122.     lea    baddisk.txt(pc),a0
  123.     bsr.b    print
  124.     bra.b    cloff
  125.  
  126. CloseAll:
  127. ;    move.l    olddir(pc),d1
  128. ;    bsr.b    changedir
  129. closedev
  130.     lea    ioreq(pc),a1
  131.     move.l    4.w,a6
  132.     jsr    -450(a6)
  133. remport
  134.     lea    tdport(pc),a1
  135.     move.l    4.w,a6
  136.     jsr    -360(a6)
  137. nooutput
  138.     move.l    dirlock(pc),d1
  139.     bsr.b    unlock
  140.     move.l    output(pc),d1
  141.     bsr.s    close
  142. .nolock
  143.     move.l    dosbase(pc),a1
  144.     move.l    4.w,a6
  145.     jsr    -414(a6)
  146. nodos
  147.     moveq    #0,d0
  148.     rts
  149.  
  150. print:
  151.     movem.l    d0-a6,-(sp)
  152.     move.l    a0,d2
  153.     moveq    #-1,d3
  154. .len    addq.l    #1,d3
  155.     tst.b    (a0)+
  156.     bne.s    .len
  157.     move.l    output(pc),d1
  158.     move.l    dosbase(pc),a6
  159.     jsr    -48(a6)
  160.     movem.l    (sp)+,d0-a6
  161.     rts
  162.  
  163. lock:    moveq    #-2,d2
  164.     move.l    dosbase(pc),a6
  165.     jmp    -84(a6)
  166. unlock:
  167.     tst.l    d1
  168.     beq.s    .f
  169.     move.l    dosbase(pc),a6
  170.     jmp    -90(a6)
  171. .f    rts
  172. close:
  173.     tst.l    d1
  174.     beq.s    .f
  175.     move.l    dosbase(pc),a6
  176.     jmp    -36(a6)
  177. .f    rts
  178. changedir:
  179.     tst.l    d1
  180.     beq.s    .f
  181.     move.l    dosbase(pc),a6
  182.     jmp    -126(a6)
  183. .f    rts
  184.  
  185. MotOff:
  186.     movem.l    d0-a6,-(sp)
  187.     lea    ioreq(pc),a1
  188.     move    #9,28(a1)
  189.     clr.l    36(a1)
  190.     move.l    4.w,a6
  191.     jsr    -456(a6)
  192.     movem.l    (sp)+,d0-a6
  193.     rts
  194.  
  195. ReadBlk:
  196.     move.l    readbuf(pc),a4
  197. ReadBlk2
  198.     movem.l    d1-a6,-(sp)
  199.     lea    ioreq(pc),a1
  200.     move    #2,28(a1)
  201.     move.l    a4,40(a1)    ;io_data
  202.     move.l    d6,d1
  203.     moveq    #9,d0
  204.     lsl.l    d0,d1
  205.     move.l    d1,36(a1)    ;io_length
  206.     move.l    d7,d1
  207.     lsl.l    d0,d1
  208.     move.l    d1,44(a1)    ;io_offset
  209.     clr.l    52(a1)
  210.     move.l    4.w,a6
  211.     jsr    -456(a6)
  212.     movem.l    (sp)+,d1-a6
  213.     rts
  214.  
  215. SaveFile:
  216.     movem.l    d5/a3,-(sp)
  217.     move.l    readlen(pc),d0
  218.     move.l    #$10002,d1
  219.     move.l    4.w,a6
  220.     jsr    -198(a6)
  221.     move.l    d0,readbuf
  222.     beq.w    .f
  223.  
  224.     moveq    #0,d0
  225.     move    picnum(pc),d0
  226.     lea    pic.num(pc),a0
  227.     moveq    #$30,d1
  228.     divu    #10,d0
  229.     add.b    d1,d0
  230.     move.b    d0,(a0)+
  231.     clr    d0
  232.     swap    d0
  233.     add.b    d1,d0
  234.     move.b    d0,(a0)+
  235. * read blocks & write file
  236.     lea    read.txt(pc),a0
  237.     bsr.w    print
  238.  
  239.     move.l    nblocks(pc),d6
  240.     bsr.w    ReadBlk
  241.     bsr.w    MotOff
  242.  
  243.     lea    pic.name(pc),a0
  244.     lea    write2.txt(pc),a1
  245. .cop    move.b    (a0)+,d0
  246.     beq.s    .zero
  247.     move.b    d0,(a1)+
  248.     bne.s    .cop
  249. .zero    move.b    #$a,(a1)+
  250.     clr.b    (a1)
  251.  
  252.     lea    write.txt(pc),a0
  253.     bsr.w    print
  254.  
  255.     lea    pic.name(pc),a0
  256.     move.l    a0,d1
  257.     move.l    #1006,d2
  258.     move.l    dosbase(pc),a6
  259.     jsr    -30(a6)
  260.     move.l    d0,fhandle
  261.     beq.s    .openerr
  262.     move.l    d0,d1
  263.     move.l    a4,d2
  264.     move.l    readlen(pc),d3
  265.     jsr    -48(a6)
  266. * close file
  267.     move.l    fhandle(pc),d1
  268.     jsr    -36(a6)
  269. * free buffer
  270. .openerr
  271.     movem.l    readlen(pc),d0/a1
  272.     move.l    4.w,a6
  273.     jsr    -210(a6)    :FreeMem()
  274. .f    movem.l    (sp)+,d5/a3
  275.     rts
  276.  
  277. *****************
  278. args    dc.l    0
  279. dosbase    dc.l    0
  280. output    dc.l    0
  281. dirlock    dc.l    0
  282. olddir    dc.l    0
  283. nblocks    dc.l    0
  284. fhandle    dc.l    0
  285. readlen    dc.l    0
  286. readbuf    dc.l    0
  287. picnum    dc.w    0
  288.  
  289. dosname:dc.b    "dos.library",0
  290. trackname:dc.b    "trackdisk.device",0
  291.  
  292. pic.name:dc.b "PIC"
  293. pic.num:dc.b "xx.IFF",0
  294.  
  295. usage.txt:
  296.  dc.b $9b,"1;33m"
  297.  dc.b "PicRestore V1.0, by Frédéric Bassaler (April 1996)",$a,$a
  298.  dc.b $9b,"m"
  299.  dc.b "This little tool works in combination with 'IFF-ILBM Ripper V1.0',",$a
  300.  dc.b "a bootblock which allows you to scan your memory for IFF-ILBM pictures,",$a
  301.  dc.b "and to write them on disk. Since the pictures are directly",$a
  302.  dc.b "written to the disk tracks, you must use this program",$a
  303.  dc.b "to read them back from your disk and save them as FILES.",$a,$a
  304.  dc.b "Please refer to PicRestore.doc for more details.",$a
  305.  dc.b $a,"Usage: PicRestore <destination path>",$a
  306.  dc.b "ex: PicRestore ram:",$a
  307.  dc.b 0
  308. hello.txt:
  309.  dc.b $9b,"1;32m"
  310.  dc.b "PicRestore V1.0, by Frédéric Bassaler (April 1996)",$a,$a
  311.  dc.b $9b,"m"
  312.  dc.b "Please insert your PICS disk in drive DF0:",$a
  313.  dc.b " and press LeftMouse to continue (RightMouse to Abort)",$a
  314.  dc.b 0
  315. read.txt:
  316.  dc.b "Reading blocks... ",$a,0
  317. write.txt:
  318.  dc.b "Writing file "
  319. write2.txt:
  320.  dcb.b 20,0
  321. finished.txt:
  322.  dc.b "All pics on disk have been restored successfully!",$a,0
  323. lockerr.txt:
  324.  dc.b "Couldn't lock directory!",$a,0
  325. baddir.txt:
  326.  dc.b "Error! I need an output directory!",$a,0
  327. readerr.txt:
  328.  dc.b "Read error! - Aborting..",$a,0
  329. baddisk.txt:
  330.  dc.b "This is NOT an IFF-ILBM Ripper V1.0 PICS disk!!",$a,0
  331.  
  332. win    dc.b "*",0
  333.  
  334. ;debug
  335. cline    dc.b "ram:",0
  336. clen=*-cline
  337.  
  338.     cnop 0,4
  339. ioreq:dcb.b 56,0
  340. tdport:dcb.b 34,0
  341.  
  342.     SECTION    buf,BSS_C
  343. hashbuf    ds.b    512
  344.